perm filename FORMAT[D,SYS] blob sn#450304 filedate 1979-06-15 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00009 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE FORMAT DOUBLE DENSITY 3330 PACK FORMATTER FOR USE WITH C1 DISK CHANNEL
C00008 00003	DATA AND CONSTANTS
C00012 00004	UUO HANDLER
C00013 00005	HANDLE THE CTY. GETTTY PUTTTY
C00015 00006	UUO ROUTINES READN GETYES
C00017 00007	STRT DDTCAL
C00019 00008	FORMAT ONE TRACK
C00022 00009	BLAST
C00029 ENDMK
C⊗;
TITLE FORMAT DOUBLE DENSITY 3330 PACK FORMATTER FOR USE WITH C1 DISK CHANNEL

FT1DSK←←0		;SET TO 1 IF ALL DISK DRIVES ARE ON THE SAME CONTROLLER

A←1
B←2
C←3
D←4
E←5
T←14
TT←15
TTT←16
P←17

APR←←0
KLPAG←←10
C1A←←140
C1B←←144
DTE←←200

;KL10 TO CONSOLE
DONG11←←20000		;RING 11'S DOORBELL
DTFLG←←444		;DTE20 OPERATION COMPLETE FLAG (RELATIVE TO EPT)
DTF11←←450		;      10 FROM 11 ARGUMENT
DTCMD←←451		;      TO 11 COMMAND WORD

;CONO C1A BITS

C1SBI←←400000		;SELECT BUS INTERFACE
  C1RSI←←40000		;RESET INTERFACE
  C1SRUN←←10000		;SET CLOCK RUN
  C1CONT←←2000		;CONTINUE CLOCK
C1SCH←←200000		;SELECT CHANNEL
  C1RST←←40000		;RESET CHANNEL
  C1CCIF←←20000		;CLEAR CHANNEL INTERRUPT FLAG
  C1INTE←←10000		;INTERRUPT ENABLE
  C1INTD←←4000		;INTERRUPT DISABLE
  C1SCF1←←2000		;SET CF1
  C1CCF1←←1000		;CLEAR CF1
  C1MPCN←←400		;CONTINUE MICROPROCESSOR
  C1LCD←←20		;LOAD CODE FROM BITS 32-35
;BITS 32-35 ARE A CODE, BIT 32 IS OFF FOR "SOFTWARE" CODES:
  C1LPT←←11		;LOAD PROGRAM TABLE STARTING ADDRESS
  C1SYSR←←2		;SYSTEM RESET
  C1SCAN←←7		;SCAN PROGRAM TABLE FOR PROGRAMS TO START

C1SDIA←←100000		;SELECT DIAGNOSTIC FUNCTIONS

;CONI C1A BITS

C1DCI←←10		;DISCONNECT IN FROM CU
CIF←←4			;CHANNEL INTERRUPT FLAG
CF1←←2			;CHANNEL FLAG 1 (INTERRUPT THE Z80, SET FROM ICH IN CONO)
CF2←←1			;CHANNEL FLAG 2 (Z80 READY FOR PROGRAM TABLE ADDRESS)

;CHANNEL PROGRAM DEFINITIONS
;LEFT HALF BITS
C1CMD←←100000			;BITS 0-3 = 10 MEANS (NON-MRT) COMMAND WORD
C1MRT←←040000			;BITS 0-3 = 04 MEANS MRT COMMAND WORD
C1JMP←←200000			;BITS 0-3 = 20 MEANS JUMP COMMAND WORD
C1TIO←←020000			;TEST I/O
C1IWC←←010000			;IGNORE WORD COUNT
C1BAK←←004000			;BACKWARDS
C1NATM←←000000			;NATURAL MODE (MODE IN BITS 7-8)
C1BYTM←←001000			;BYTE MODE
C1CBYT←←000400			;COUNT BYTES
				;BITS 10-17 ARE THE IBM COMMAND BYTE
;RIGHT HALF BITS
C1SLE←←20			;STOP ON LENGTH ERROR
C1CEC←←10			;CHANNEL END CONTINUE
C1NOC←←2			;NO CHAINING
C1RPT←←1			;REPEAT UNTIL STATUS MODIFIER IS ON IN ENDING STATUS

;PROGRAM TABLE
C1CCW←←0			;RELATIVE ADDRESS OF CHANNEL CONTROL WORD
C1ISW←←1			;INTERRUPT SOURCE WORD
   C1PTPE←←100000		;PARITY ERROR IN PROGRAM TABLE
   C1PTNX←←40000		;NXM IN PROGRAM TABLE
   C1IQF←←20000			;INTERRUPT QUEUE FULL
C1PPTR←←2			;FIRST PROGRAM POINTER

;PROGRAM HEADER AND PROGRAM
C1PCW←←0			;RELATIVE ADDRESS OF PROGRAM CONTROL WORD
   C1BW←←100			   ;BUSY WAIT BIT IN PCW
C1STA←←1			;STATUS A
  ;RIGHT HALF BITS
   C1HLT←←400000		;PROGRAM EXECUTED A HALT
   C1LE←←200000			;LENGTH ERROR
   C1SE←←100000			;SELECT ERROR
   C1PE←←040000			;PARITY ERROR
   C1NXM←←020000		;NXM
   C1BPE←←010000		;IBM BUS PARITY ERROR
   C1SSE←←002000		;SIGNAL SEQUENCE ERROR
  ;LEFT HALF BITS
   C1PCMA←←100000		;1→ERROR POINTER TO BY PC, 0→POINTED TO BY MA
C1STB←←2			;STATUS B
C1STC←←3			;STATUS C
C1INST←←4			;FIRST INSTRUCTION OF CHANNEL PROGRAM

;IBM STATUS BYTE BITS
ATTN←←200
STMOD←←100
CUEND←←40
IBMBSY←←20
CHNEND←←10
DEVEND←←4
UCHK←←2
UXCPTN←←1

;DEVICE ADDRESSES
CUADDR←←6			;CONTROL UNIT ADDRESS

C1SEEK←←<C1CMD!C1BYTM!C1CBYT!7,,0>
C1SFM←←<C1CMD!C1BYTM!C1CBYT!37,,0>
C1WHAD←←<C1CMD!C1BYTM!C1CBYT!31,,0>
C1WR0←←<C1CMD!C1BYTM!C1CBYT!25,,0>
C1WCKD←←<C1CMD!C1BYTM!C1CBYT!35,,0>

DEFINE C1WCMA (WC,MA)
<	BYTE (1)1 (13)WC (22)MA
>
;DATA AND CONSTANTS

EXTERNAL DDT

.LOAD SYS:EDDT.REL

LOC 74
	JRST DDT		;KEEP SYMBOLS AROUND

LOC 200

BEGIN:	JRST STRT		;DISPATCH TO MAIN LOOP
	JRST DDT		;DISPATCH TO DDT

LOC 1000			;LEAVE ROOM FOR KL10 EPT AT PHYSICAL ZERO

CPOPJ1:	AOS (P)
CPOPJ:	POPJ P,

SKIPF:	0			;SET TO -1 TO SKIP RETURN FROM READN

RETLEN←←40
RETBYT←←RETLEN*9/2
RECLEN←←200
RECBYT←←RECLEN*9/2
KEYLEN←←60
KEYBYT←←KEYLEN*9/2		;PAD RECORD 0 KEY WITH 60 WORDS
NPACKS←←8			;TOTAL OF 8 PACKS
TRKCYL←←=19
CYLPAC←←=815
MAXTRK←←TRKCYL*CYLPAC-1		;NUMBER OF TRACKS-1
RCPTRK←←=18

TRACK:	0
DRIVE:	0

PATCH:	BLOCK 200	;PATCH SPACE

PDL:	BLOCK 1000

CNT:	0		;PLACE TO KEEP TRY COUNT
CRLF:	BYTE (7) 15,12

;TABLE OF WHICH DRIVE IS ON WHICH CHANNEL, 0 FOR C1A, 1 FOR C1B
C1WCHN:
IFE FT1DSK,<
	0
	1
	0
	1
	0
	1
	0
	1
>;IFE FT1DSK
IFN FT1DSK,<
	1
	1
	1
	1
	1
	1
	1
	1
>;IFN FT1DSK
IFN .-C1WCHN-NPACKS,<.FATAL GUESS WHAT YOU FORGOT TO CHANGE>

C1PPTP:	C1APT+C1PPTR
	C1BPT+C1PPTR

C1CIFI:	CONO C1A,C1SCH!C1CCIF		;INST TO CLEAR CIF INDEXED BY CHANNEL NUMBER
	CONO C1B,C1SCH!C1CCIF

C1ERR:	0			;ERROR COUNT

FILMSK:	BYTE(8)300	;PERMIT ALL WRITES

SKDAT:	BLOCK 2

SKCYL:	POINT 16,SKDAT,31
SKHD:	POINT 8,SKDAT+1,15

HADAT:	BLOCK 2

HACYL:	POINT 16,HADAT,23
HAHD:	POINT 8,HADAT+1,7

R0DAT:	BLOCK <8+RETBYT+KEYBYT+3>/4
RLEN←←<8+RECBYT+3>/4		;NUMBER OF WORDS OF STORAGE PER TRACK
R1DAT:	BLOCK RCPTRK*RLEN
FRMEND::

W0CYL:	POINT 16,R0DAT,15
W0HD:	POINT 8,R0DAT,31
W0KL:	POINT 8,R0DAT+1,15
W0DL:	POINT 16,R0DAT+1,31

WNCYL:	POINT 16,R1DAT(TTT),15
WNHD:	POINT 8,R1DAT(TTT),31
WNRN:	POINT 8,R1DAT+1(TTT),7
WNDL:	POINT 16,R1DAT+1(TTT),31

C1ZERO::
C1APT:	BLOCK C1PPTR+NPACKS+1	;CHN CTL WD, INT WD, 1 PGM PTR PER DRIVE, 1 END MARK
C1BPT:	BLOCK C1PPTR+NPACKS+1	;PROGRAM TABLE FOR SECOND CHANNEL
C1PH:	BLOCK C1INST		;PROGRAM HEADER
C1ZEND::
	C1SEEK			;SEEK COMMAND
	C1WCMA 6,SKDAT		;SEEK DATA POINTER
	C1SFM			;SET FILE MASK
	C1WCMA 1,FILMSK		;PERMIT ALL WRITES
	C1WHAD			;WRITE HOME ADDRESS
	C1WCMA 5,HADAT		;HOME ADDRESS DATA POINTER
	C1WR0			;WRITE RECORD ZERO
	C1WCMA 8+KEYBYT+RETBYT,R0DAT
FOR I←0,RCPTRK-2
<	C1WCKD			;WRITE COUNT KEY AND DATA
	C1WCMA 8+RECBYT,R1DAT+I*RLEN
>
	C1WCKD!C1NOC		;WRITE COUNT KEY AND DATA (UNCHAINED)
	C1WCMA 8+RECBYT,R1DAT+<RCPTRK-1>*RLEN
	0
;UUO HANDLER

OPDEF PUTCHR[1B8]
OPDEF GETCHR[2B8]
OPDEF OUTSTR[3B8]
OPDEF OCTPNT[4B8]
OPDEF LOCPNT[5B8]
OPDEF DECPNT[6B8]
OPDEF SIXOUT[7B8]
OPDEF ERROR[10B8]		;THIS MUST BE AN LUUO FOR THE KL10


UUOCON:	0
	PUSH P,UUOCON		;SAVE THE RETURN ADDRESS
	PUSH P,T
	PUSH P,TT
	PUSH P,TTT
	LDB T,[POINT 9,40,8]
	CAIL T,UUOLEN
	MOVEI T,0
	PUSHJ P,@UUODIS(T)
UUORET:	POP P,TTT
	POP P,TT
	POP P,T
	POPJ P,

UUODIS:	ERR
	%PUTCHR
	%GETCHR
	%OUTSTR
	%OCTPNT
	%LOCPNT
	%DECPNT
	%SIXOUT
	ERR
UUOLEN←←.-UUODIS

ERR:	OUTSTR[ASCIZ/π?
/]
	POPJ P,
;HANDLE THE CTY. GETTTY PUTTTY

DTEXX:	MOVEM T,DTCMD
	SETZM DTFLG			;CLEAR 11'S RESPONSE FLAG
	CONO DTE,DONG11			;RING FOR 11
	SKIPN DTFLG			;WAIT FOR RESPONSE
	JRST .-1
	MOVE T,DTF11			;GET 11'S RESPONSE WORD
	POPJ P,

PUTTTY:	PUSH P,T
	ANDI T,177
	PUSHJ P,DTEXX
	POP P,T
	POPJ P,

GETTTY:	MOVEI T,3400
	PUSHJ P,DTEXX
	JUMPE T,GETTTY
	CAIL T,"a"
	CAILE T,"z"
	CAIA
	SUBI T,40
	CAIN T,177		;RUBOUT?
	JRST RUBOUT
	PUSHJ P,PUTTTY		;ECHO
	CAIE T,15		;CR?
	CAIN T,12
	CAIA
	POPJ P,
	PUSH P,T
	TRC T,7			;CHANGE 15 TO 12 AND VICE VERSA
	PUSHJ P,PUTTTY
	POP P,T
	POPJ P,

RUBOUT:	MOVEI T,"X"
	PUSHJ P,PUTTTY
	MOVEI T,"X"
	PUSHJ P,PUTTTY
	MOVEI T,"X"
	PUSHJ P,PUTTTY
	MOVEI T,15
	PUSHJ P,PUTTTY
	MOVEI T,12
	PUSHJ P,PUTTTY
	JRST MAIN		;MAIN WILL RESET THE STACK
;UUO ROUTINES READN GETYES

%OUTSTR:HRRZ TT,40		;GET EFFECTIVE ADDRESS OF UUO
	HRLI TT,(<POINT 7,0>)
%OUTS1:	ILDB T,TT
	JUMPE T,CPOPJ
	PUSHJ P,PUTTTY
	JRST %OUTS1

%PUTCHR:PUSH P,T
	HRRZ T,40
	PUSHJ P,PUTTTY
	POP P,T
	POPJ P,

%GETCHR:PUSH P,T
	PUSHJ P,GETTTY
	PUSH P,TT
	HRRZ TT,40		;EFFECTIVE ADDRESS OF UUO
	MOVEM T,(TT)
	POP P,TT
	POP P,T
	POPJ P,

%OCTPNT:HRRZ TT,40		;EFFECTIVE ADDRESS OF UUO
	MOVE TT,(TT)		;FETCH WORD
	MOVEI TTT,=12
OCTLOP:	SETZ T,
	LSHC T,3
	ADDI T,60
	PUSHJ P,PUTTTY
	SOJG TTT,OCTLOP
	POPJ P,

%DECPNT:SKIPA T,[=10]
%LOCPNT:MOVEI T,10
	MOVE TT,40
	MOVE TT,(TT)
LOCLOP:	IDIVI TT,(T)
	HRLM TTT,(P)
	JUMPE TT,.+2
	PUSHJ P,LOCLOP
	HLRZ T,(P)
	ADDI T,60
	JRST PUTTTY

%SIXOUT:MOVE TT,40
	MOVE TT,(TT)
SIXOU1:	JUMPE TT,CPOPJ
	SETZ T,
	LSHC T,6
	ADDI T,40
	PUSHJ P,PUTTTY
	JRST SIXOU1

READN:	SETZB T,SKIPF		;GET A NUMBER.  SKIPS IF NUMBER SEEN
READN1:	GETCHR A
	CAIL A,"0"
	CAILE A,"9"
	JRST SKPOPJ		;SKIP OR NOT
	IMULI T,=10
	ADDI T,-"0"(A)
	SETOM SKIPF
	JRST READN1

SKPOPJ:	SKIPE SKIPF
	AOS (P)
	POPJ P,

GETYES:	OUTSTR [ASCIZ /Go on?/]
GETYS1:	GETCHR A
	OUTSTR CRLF
	CAIN A,"D"
	JRST DDTCAL			;GO TO DDT
	CAIN A,"Y"
	AOS (P)
	POPJ P,
;STRT DDTCAL

DDTCAL:	OUTSTR [ASCIZ/*DDT*/]
	JRST DDT

HUH:	OUTSTR [ASCIZ / ???
/]
	JRST MAIN

STRT:	DATAO KLPAG,[400100,,0]		;START OUT WITH SOME DECENT ACS
	CONO KLPAG,0			;NO CACHE, EPT TO ZERO. NO MAP, NO TRAPS
	MOVEI T,-1
	MOVEM T,37			;SET JOBREL FOR DDT.
	MOVE T,[JSR UUOCON]
	MOVEM T,41
	MOVE P,[-1000,,PDL-1]
	CONO APR,200000			;IO RESET
	OUTSTR [ASCIZ /
Make sure the KA10 is RESET.
/]
	PUSHJ P,BLAST			;CLEAR CHANNEL
MAIN:	MOVE P,[-1000,,PDL-1]
	PUSHJ P,BLAST
	OUTSTR [ASCIZ /Type drive number with pack to format: /]
	PUSHJ P,READN
	 JRST HUH
	CAIE A,15
	JRST HUH
	CAIL T,NPACKS
	JRST ILLDRV
	MOVEM T,DRIVE
	SETZM TRACK
FT0:	MOVEI T,5			;RETRY 5 TIMES IN QUIET MODE
	MOVEM T,CNT
FT1:	PUSHJ P,FTRACK			;FORMAT TRACK
	 JRST FLOSE
	AOS T,TRACK			;NEXT TRACK
	CAIG T,MAXTRK			;GREATER THAN MAXIMUM TRACK NUMBER?
	JRST FT0
	OUTSTR [ASCIZ /Done, /]
	MOVE A,TRACK
	DECPNT A
	OUTSTR [ASCIZ / tracks formatted.
/]
	JRST MAIN

FLOSE:	SOSL CNT
	JRST FT1
	ERROR
	OUTSTR [ASCIZ /Format error. /]
	PUSHJ P,GETYES
	 JRST MAIN			;NO
	JRST FT1			;TRY AGAIN, SAME TRACK

ILLDRV:	OUTSTR [ASCIZ /Illegal drive number
/]
	JRST MAIN
;FORMAT ONE TRACK

FTRACK:	SETZM R0DAT
	MOVE T,[R0DAT,,R0DAT+1]
	BLT T,FRMEND-1
	SETZM SKDAT
	SETZM SKDAT+1
	MOVE T,TRACK
	IDIVI T,TRKCYL
	DPB T,SKCYL		;SET UP SEEK CYL
	DPB TT,SKHD		;AND HEAD
	SETZM HADAT
	SETZM HADAT+1
	DPB T,HACYL
	DPB TT,HAHD
	DPB T,W0CYL
	DPB TT,W0HD
	MOVEI B,RETBYT		;NUMBER OF BYTES OF RETRIEVAL
	DPB B,W0DL
	MOVEI B,KEYBYT		;KEY AREA BYTES (R0 ONLY)
	DPB B,W0KL
	MOVEI A,1		;RECORD NUMBER
	MOVEI B,RECBYT		;NUMBER OF BYTES/RECORD (DATA AREA - NOT RETRIEVAL)
	MOVSI TTT,-RCPTRK
FTRK1:	DPB T,WNCYL
	DPB TT,WNHD
	DPB A,WNRN
	DPB B,WNDL
	ADDI A,1
	ADD TTT,[1,,RLEN]
	JUMPL TTT,FTRK1
	SETZM C1ERR
	MOVE T,DRIVE
	MOVE TT,C1WCHN(T)		;C1 CHANNEL NUMBER
	DPB T,[POINT 4,@C1PPTP(TT),12]	;STORE DISK DRIVE ADDRESS
	MOVEI T,4
	DPB T,[POINT 5,@C1PPTP(TT),4]	;STORE START CODE
C1WAIT:	JUMPN TT,C1WAIB
	CONSO C1A,CIF
	JRST .-1
	MOVEI T,0
	EXCH T,C1APT+C1ISW
C1WAIA:	TLC T,200000
	TLNE T,600000
	JRST C1WERR
	MOVE T,C1PH+C1STA		;STATUS A WORD
	TRNN T,C1HLT
	JRST C1WERR
	XCT C1CIFI(TT)			;CLEAR INT FLAG
	JRST CPOPJ1

C1WAIB:	CONSO C1B,CIF
	JRST .-1
	MOVEI T,0
	EXCH T,C1BPT+C1ISW
	JRST C1WAIA

C1WERR:	AOS T,C1ERR
	CAIL T,=10
	POPJ P,
	PUSHJ P,BLAST
	MOVEI T,4
	DPB T,[POINT 5,@C1PPTP(TT),4]		;START C1 AGAIN
	JRST C1WAIT
;BLAST

BLAST:	CONO C1A,C1SBI!C1RSI!C1SRUN!C1CONT	;RESET ALL CHANNELS START CLOCK
	CONO C1A,C1SCH!C1RST!C1MPCN		;RESET CHAN A AND START UP
	CONO C1B,C1SCH!C1RST!C1MPCN		;RESET CHAN B AND START UP
	CONO C1A,C1SCH!C1SCF1!C1LCD!C1SYSR	;TELL C1A TO DO A SYSTEM RESET
	CONSZ C1A,CF1				;WAIT FOR IT TO DROP CF1
	JRST .-1
	CONO C1B,C1SCH!C1SCF1!C1LCD!C1SYSR	;TELL C1B TOO
	CONSZ C1B,CF1
	JRST .-1
	CONO C1A,C1SCH!C1SCF1!C1LCD!C1LPT	;INT THE CHANNEL FOR LD ...
	CONO C1B,C1SCH!C1SCF1!C1LCD!C1LPT	;...PGM TABLE.
	SETZM C1ZERO
	MOVE T,[C1ZERO,,C1ZERO+1]
	BLT T,C1ZEND-1
	MOVEI T,253			;HAS TO BE 253 (THE CHANNEL CHECKS)
	MOVEM T,C1APT+C1CCW
	MOVEM T,C1BPT+C1CCW
	MOVEI T,C1BW			;BUSY WAIT BIT
	MOVEM T,C1PH
	MOVE T,[BYTE (5)37 (8)CUADDR⊗4 (1)0 (22)C1PH]
	MOVEM T,C1APT+C1PPTR		;STORE PROGRAM POINTER IN PROGRAM TABLE
	MOVE T,[BYTE (5)37 (8)<CUADDR+1>⊗4 (1)0 (22)C1PH]
	MOVEM T,C1BPT+C1PPTR
	CONSO C1A,CF2			;WAIT FOR CHANNEL TO BE READY FOR PGM TBL
	JRST .-1
	DATAO C1A,[C1APT]		;TELL IT WHERE THE PROGRAM TABLE IS
	CONO C1A,C1SCH!C1CCF1		;CLEAR CF1 (TELL IT WE'VE TOLD IT)
	CONSZ C1A,CF2			;WAIT FOR CHANNEL TO DROP CF2
	JRST .-1
	CONSO C1B,CF2			;REPEAT FOR SECOND CHANNEL
	JRST .-1
	DATAO C1B,[C1BPT]
	CONO C1B,C1SCH!C1CCF1
	CONSZ C1B,CF2
	JRST .-1
	POPJ P,

	END STRT